package com.alison.datastream.chapter2_transform;

import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author alison
 * @Date 2024/4/8 16:58
 * @Version 1.0
 * @Description
 *
 * min, max, minBy, maxBy
 */
public class T3_Aggregation {

    /*
    max、min、sum 会分别返回最大值、最小值和汇总值；而 minBy 和 maxBy 则会把最小或者最大的元素全部返回。
     */
    public static void main(String[] args) throws Exception {
        //获取运行环境的上下文
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //获取数据源
        List<Tuple3<Integer, String, Integer>> data = new ArrayList();
        data.add(Tuple3.of(0, "梨", 542));
        data.add(Tuple3.of(0, "葡萄", 331));
        data.add(Tuple3.of(0, "苹果", 894));
        data.add(Tuple3.of(0, "西瓜", 705));
        data.add(Tuple3.of(1, "火龙果",37));
        data.add(Tuple3.of(1, "苹果",647));
        data.add(Tuple3.of(1, "葡萄",475));
        data.add(Tuple3.of(1, "苹果",417));

        DataStreamSource<Tuple3<Integer, String, Integer>> items = env.fromCollection(data);
        items.keyBy(0)
//                .min(2)
                .minBy(2)
                .print();

        //一定要触发执行，不然没结果输出
        env.execute();

    }


    /*

 min(2) output:

6> (0,梨,542)
6> (0,梨,331)
6> (0,梨,331)
6> (0,梨,331)    **** 这里331 正确, ”梨“　不对
6> (1,火龙果,37)
6> (1,火龙果,37)
6> (1,火龙果,37)
6> (1,火龙果,37)

 minBy(2) output:
6> (0,梨,542)
6> (0,葡萄,331)
6> (0,葡萄,331)
6> (0,葡萄,331)  *****  331, 葡萄 正确
6> (1,火龙果,37)
6> (1,火龙果,37)
6> (1,火龙果,37)
6> (1,火龙果,37)

总结：

min只返回计算的最小值，而最小值对应的其他数据不保证正确。
minBy返回计算的最小值，并且最小值对应的其他数据是保证正确的。

     */
}
